/*
 * SaglikKuruluDenetci.java
 */
package eDoktor;

import eDoktor.doktor.Doktor;
import eDoktor.hastalik.Belirti;
import eDoktor.hastalik.BelirtiModeli;
import eDoktor.hastalik.Hastalik;
import eDoktor.hastalikGrubu.HastalikGrubu;
import eDoktor.hastalikGrubu.Soru;
import eDoktor.hastalikGrubu.SoruModeli;
import eDoktor.saglikKurulu.SaglikKuruluUyesi;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

@ManagedBean(name = "SaglikKuruluDenetci")
@SessionScoped

/**
 * Sağlık Kurulu denetçi sınıfı
 * Bu sınıf Sağlık Kurulu ile ilgili arayüz işlemlerinin gerçekleşmesini sağlar.
 * @author Onuralp
 */
public class SaglikKuruluDenetci implements Serializable  {
    private String kullaniciAdi;
    private String sifre;
    private String girisMesaji;
    private SaglikKuruluUyesi saglikKuruluUyesi;
    private List<HastalikGrubu> hastalikGruplari;
    private HastalikGrubu secilenHastalikGrubu;
    private Hastalik secilenHastalik;
    private Belirti secilenBelirti;
    private List<Belirti> belirtiler;
    private Belirti[] secilenBelirtiler;
    private BelirtiModeli belirtiModeli; 
    private List<Soru> sorular;
    private SoruModeli soruModeli;
    private String eskiSifre;
    private String yeniSifre;
    private String yeniSifreYeniden;
    private final static String[] secenekler; 
    static {  
        secenekler = new String[2];  
        secenekler[0] = "Evet/Hayır";  
        secenekler[1] = "Yüksek/Orta/Düşük"; 
    }
    
    /**
     * SaglikKuruluDenetci sınıfının yapılandırıcısı
     */
    public SaglikKuruluDenetci() {
        kullaniciAdi = "";
        sifre = "";
        girisMesaji = "";
        saglikKuruluUyesi = new SaglikKuruluUyesi();
        hastalikGruplari = new ArrayList<HastalikGrubu>();
        secilenHastalikGrubu = new HastalikGrubu();
        secilenHastalik = new Hastalik();
        secilenBelirti = new Belirti();
        belirtiler = new ArrayList<Belirti>();
        belirtiModeli = new BelirtiModeli(belirtiler);
        sorular = new ArrayList<Soru>();
        soruModeli = new SoruModeli(sorular);
        eskiSifre = "";
        yeniSifre = "";
        yeniSifreYeniden = "";
    }

    /**
     * SaglikKuruluDenetci sınıfının degiskenlerine erişmeyi sağlayan fonksiyonlar 
     */
    
    public String getGirisMesaji() {
        return girisMesaji;
    }

    public void setGirisMesaji(String girisMesaji) {
        this.girisMesaji = girisMesaji;
    }

    public String getKullaniciAdi() {
        return kullaniciAdi;
    }

    public void setKullaniciAdi(String kullaniciAdi) {
        this.kullaniciAdi = kullaniciAdi;
    }

    public String getSifre() {
        return sifre;
    }

    public void setSifre(String sifre) {
        this.sifre = sifre;
    }

    public SaglikKuruluUyesi getSaglikKuruluUyesi() {
        return saglikKuruluUyesi;
    }

    public void setSaglikKuruluUyesi(SaglikKuruluUyesi saglikKuruluUyesi) {
        this.saglikKuruluUyesi = saglikKuruluUyesi;
    }

    public List<HastalikGrubu> getHastalikGruplari() {
        return hastalikGruplari;
    }

    public void setHastalikGruplari(List<HastalikGrubu> hastalikGruplari) {
        this.hastalikGruplari = hastalikGruplari;
    }

    public HastalikGrubu getSecilenHastalikGrubu() {
        return secilenHastalikGrubu;
    }

    public void setSecilenHastalikGrubu(HastalikGrubu secilenHastalikGrubu) {
        this.secilenHastalikGrubu = secilenHastalikGrubu;
    }

    public Hastalik getSecilenHastalik() {
        return secilenHastalik;
    }

    public void setSecilenHastalik(Hastalik secilenHastalik) {
        this.secilenHastalik = secilenHastalik;
    }

    public Belirti getSecilenBelirti() {
        return secilenBelirti;
    }

    public void setSecilenBelirti(Belirti secilenBelirti) {
        this.secilenBelirti = secilenBelirti;
    }

    public List<Belirti> getBelirtiler() {
        return belirtiler;
    }

    public void setBelirtiler(List<Belirti> belirtiler) {
        this.belirtiler = belirtiler;
    }

    public Belirti[] getSecilenBelirtiler() {
        return secilenBelirtiler;
    }

    public void setSecilenBelirtiler(Belirti[] secilenBelirtiler) {
        this.secilenBelirtiler = secilenBelirtiler;
    }
    
    public BelirtiModeli getBelirtiModeli() {
        return belirtiModeli;
    }

    public void setBelirtiModeli(BelirtiModeli belirtiModeli) {
        this.belirtiModeli = belirtiModeli;
    }

    public List<Soru> getSorular() {
        return sorular;
    }

    public void setSorular(List<Soru> sorular) {
        this.sorular = sorular;
    }

    public SoruModeli getSoruModeli() {
        return soruModeli;
    }

    public void setSoruModeli(SoruModeli soruModeli) {
        this.soruModeli = soruModeli;
    }

    public String[] getSecenekler() {
        return secenekler;
    }

    public String getEskiSifre() {
        return eskiSifre;
    }

    public void setEskiSifre(String eskiSifre) {
        this.eskiSifre = eskiSifre;
    }

    public String getYeniSifre() {
        return yeniSifre;
    }

    public void setYeniSifre(String yeniSifre) {
        this.yeniSifre = yeniSifre;
    }

    public String getYeniSifreYeniden() {
        return yeniSifreYeniden;
    }

    public void setYeniSifreYeniden(String yeniSifreYeniden) {
        this.yeniSifreYeniden = yeniSifreYeniden;
    }
    
    /**
     * Oturumu aç. 
     * @param actionEvent Oturum aç
     */
    public void oturumuAc(ActionEvent actionEvent) {  
        FacesMessage mesaj = null;
        boolean onay = false;
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();            
            if ((veriTabaniSurucusu.kullaniciBilgileriniAra(saglikKuruluUyesi, kullaniciAdi, sifre)) && (saglikKuruluUyesi.getKullaniciTuru().equals("Sağlık Kurulu"))) {
                onay = true;
            }
            if ((!kullaniciAdi.equals("")) && (!sifre.equals("")) && onay) {
                veriTabaniSurucusu.saglikKuruluUyesiAra(saglikKuruluUyesi);
                girisMesaji = saglikKuruluUyesi.girisMesaji();
                FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKurulu.xhtml");
            } 
            else {  
                mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Kullanıcı adı ve/veya parola yanlış", "");  
            }
            veriTabaniSurucusu.baglantiyiKes();
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
        FacesContext.getCurrentInstance().addMessage(null, mesaj);  
    } 
    
    /**
     * Oturumu kapat.
     * @param actionEvent Oturumu kapat
     */
    public void oturumuKapat(ActionEvent actionEvent) {
        kullaniciAdi = "";
        sifre = ""; 
        girisMesaji = "";
        eskiSifre = "";
        yeniSifre =  "";
        yeniSifreYeniden = "";
        saglikKuruluUyesi = new SaglikKuruluUyesi();
        hastalikGruplari.clear();
        secilenHastalikGrubu = new HastalikGrubu();
        secilenHastalik = new Hastalik();
        secilenBelirti = new Belirti();
        belirtiler.clear();
        sorular.clear();
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluGiris.xhtml");
        } catch (IOException hata) {
            System.out.println("Hata(IOException): " + hata.getMessage());
        }
    }
    
    /**
     * Hastalık gruplarını görüntüle.
     * @param actionEvent Görüntüle
     */
    public void hastalikGruplariniGoruntule(ActionEvent actionEvent) {  
        FacesMessage mesaj = null;
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            hastalikGruplari = veriTabaniSurucusu.hastalikGrubuAra();
            if (!hastalikGruplari.isEmpty()) {
                FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastalikGruplari.xhtml");
            } 
            else {  
                mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Sistemde hastalık grubu bulunmuyor.", "");  
            }
            veriTabaniSurucusu.baglantiyiKes();
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
        FacesContext.getCurrentInstance().addMessage(null, mesaj);  
    } 
    
    /**
     * Hastalık grubuna ait hastalıkları görüntüle.
     */
    public void hastaliklariGoruntule() {
        FacesMessage mesaj = null;
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            veriTabaniSurucusu.hastalikAra(secilenHastalikGrubu);
            for (Hastalik hastalik : secilenHastalikGrubu.getHastaliklar()) {
                veriTabaniSurucusu.belirtiAra(hastalik);
                veriTabaniSurucusu.teshisAra(hastalik);
                veriTabaniSurucusu.tedaviAra(hastalik);
            }
            veriTabaniSurucusu.soruAra(secilenHastalikGrubu);
            if (!secilenHastalikGrubu.getHastaliklar().isEmpty()) {
                FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastaliklar.xhtml");
            } 
            else {  
                mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Sistemde hastalık grubu bulunmuyor.", "");  
            }
            veriTabaniSurucusu.baglantiyiKes();
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
        FacesContext.getCurrentInstance().addMessage(null, mesaj);  
    }
    
    /**
     * Yeni hastalık ekleme ekranını görüntüle
     * @param actionEvent Görüntüle
     */
    public void yeniHastalikEkle(ActionEvent actionEvent) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastalikBilgileri.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Yeni hastalık için belirti ekleme ekranını görüntüle
     * @param actionEvent Görüntüle
     */
    public void yeniHastaligaBelirtiEkle(ActionEvent actionEvent) {
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            veriTabaniSurucusu.hastalikEkle(secilenHastalik, secilenHastalikGrubu.getNo());
            secilenHastalik.setNo(veriTabaniSurucusu.hastalikAra(secilenHastalik.getTanim()));
            veriTabaniSurucusu.belirtiAra(belirtiler);
            veriTabaniSurucusu.baglantiyiKes();
            FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastalikBelirti.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Belirti kaydını oluştur.
     * @param actionEvent Oluştur
     */
    public void belirtiyiOlustur(ActionEvent actionEvent) {
        try {
            Belirti belirti = new Belirti();
            belirti.setNo(secilenBelirti.getNo());
            belirti.setTanim(secilenBelirti.getTanim());
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            veriTabaniSurucusu.belirtiEkle(belirti);
            veriTabaniSurucusu.baglantiyiKes();
            belirtiler.add(belirti);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Belirti eklendi.","")); 
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Yeni hastalık için soru ekleme ekranını görüntüle
     * @param actionEvent Görüntüle
     */
    public void yeniHastaligaSoruEkle(ActionEvent actionEvent) {
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            for (Belirti belirti : secilenBelirtiler) {
                belirti.setNo(veriTabaniSurucusu.belirtiAra(belirti.getTanim()));
                Soru soru = new Soru();
                soru.setBelirti(belirti);
                sorular.add(soru);
            }
            for (Belirti belirti : secilenBelirtiler) {
                secilenHastalik.getBelirtiler().add(belirti);
            }
            veriTabaniSurucusu.hastaliklarinBelirtileriEkle(secilenHastalik);
            veriTabaniSurucusu.baglantiyiKes();
            FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastalikSoru.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Yeni hastalık için teşhis ekleme ekranını görüntüle
     * @param actionEvent Görüntüle
     */
    public void yeniHastaligaTeshisEkle(ActionEvent actionEvent) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastalikTeshis.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Yeni hastalık için tedavi ekleme ekranını görüntüle
     * @param actionEvent Görüntüle
     */
    public void yeniHastaligaTedaviEkle(ActionEvent actionEvent) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastalikTedavi.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Yeni hastalığı onayla.
     * @param actionEvent 
     */
    public void yeniHastaligiOnayla(ActionEvent actionEvent) {
        try {
            String kayit = "";
            for (Belirti belirti : secilenHastalik.getBelirtiler()) {
                kayit += (new Integer(belirti.getNo())).toString() + "\t";
            }
            kayit += "X\n";
            for (int i=0; i<secilenHastalik.getBelirtiler().size(); i++) {
                kayit += "Evet" + "\t";
            }
            kayit += "Evet\n";
            for (int i=0; i<secilenHastalik.getBelirtiler().size(); i++) {
                kayit += "Hayır" + "\t";
            }
            kayit += "Hayır\n";
            Writer cikti = null;
            String dosyaYolu = "C:\\Veriler\\" + secilenHastalik.getTanim() + ".txt";
            File dosya = new File(dosyaYolu);
            cikti = new BufferedWriter(new FileWriter(dosya));
            cikti.write(kayit);
            cikti.close();
            System.out.println("Kayıt: " + kayit);
            FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastalikOnaylama.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Hastalığı kaydet.
     */
    public void hastaligiKaydet() {
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            for (Soru soru : sorular) {
                soru.secenekleriOlustur();
                veriTabaniSurucusu.soruEkle(soru, secilenHastalik, soru.getBelirti(), secilenHastalikGrubu.getNo());
            }
            veriTabaniSurucusu.teshisEkle(secilenHastalik);
            veriTabaniSurucusu.tedaviEkle(secilenHastalik);
            veriTabaniSurucusu.baglantiyiKes();
            secilenHastalikGrubu.getHastaliklar().add(secilenHastalik);
            FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastaliklar.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Hastalığı seç ve düzenleme ekranına geç.
     */
    public void hastaligiSecDuzenle() {
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastalikDuzenle.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Hastalığı düzenle.
     */
    public void hastaligiDuzenle() {
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            veriTabaniSurucusu.hastalikGuncelle(secilenHastalik, secilenHastalikGrubu.getNo());
            veriTabaniSurucusu.teshisGuncelle(secilenHastalik);
            veriTabaniSurucusu.tedaviGuncelle(secilenHastalik);
            veriTabaniSurucusu.baglantiyiKes();
            FacesContext.getCurrentInstance().getExternalContext().redirect("SaglikKuruluHastaliklar.xhtml");
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Hastalığı kaldır.
     */
    public void hastaligiKaldir() {
        try {
            VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
            veriTabaniSurucusu.baglantiyiKur();
            veriTabaniSurucusu.hastalikSil(secilenHastalik);
            veriTabaniSurucusu.baglantiyiKes();
            secilenHastalikGrubu.getHastaliklar().remove(secilenHastalik);
        } catch (Exception hata) {
            System.out.println("Hata(Exception): " + hata.getMessage());
        }
    }
    
    /**
     * Şifreyi değiştir.
     * @param actionEvent Güncelle 
     */
    public void sifreyiDegistir(ActionEvent actionEvent) {
        FacesMessage mesaj = null;
        if(sifre.equals(eskiSifre)){
            if(yeniSifre.equals(yeniSifreYeniden)){
                saglikKuruluUyesi.setSifre(yeniSifre);
                try {
                    VeriTabaniSurucusu veriTabaniSurucusu = VeriTabaniSurucusu.ornekOlustur();
                    veriTabaniSurucusu.baglantiyiKur();
                    veriTabaniSurucusu.kullaniciBilgileriGuncelle(saglikKuruluUyesi);
                    veriTabaniSurucusu.baglantiyiKes();
                    mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Şifreniz başarı ile değiştirildi.", "");
                } catch (Exception hata) {
                    System.out.println("Hata(Exception): " + hata.getMessage());
                }
            }
            else{
                mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Yeni parolalar uyuşmuyor.", "");
            }
        }
        else{
            mesaj = new FacesMessage(FacesMessage.SEVERITY_WARN, "Parola yanlış", "");
        }
        FacesContext.getCurrentInstance().addMessage(null, mesaj);  
    }
}
